package com.jielihaofeng.netty.eventloop;

import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.util.concurrent.EventExecutor;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author Johnnie Wind
 * @description EventLoop 演示
 * @date 2021/11/9 11:53
 */
@Slf4j
public class TestEventLoop {

    public static void main(String[] args) {
        // 无参构造会取值Math.max(1, SystemPropertyUtil.getInt("io.netty.eventLoopThreads", NettyRuntime.availableProcessors() * 2));
        EventLoopGroup group = new NioEventLoopGroup(2);
        //        EventLoopGroup group1 = new DefaultEventLoopGroup(2); // 处理普通任务和定时任务，不能处理IO事件
        // 获取下一个时间循环对象
        System.out.println(group.next());
        System.out.println(group.next());
        System.out.println(group.next());
        // 遍历
        for (EventExecutor eventLoop : group) {
            System.out.println(eventLoop);
        }

        log.debug("main");

        // 执行普通任务，继承线程池的execute submit
        // 可以做异步处理
        group.next().submit(() -> {
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            log.debug("ok");
        });

        // 定时任务，以一定频率执行FixedRate，作用：keepalive连接保护
        // 一秒打印一次OK
        group.next().scheduleAtFixedRate(() -> {
            log.debug("ok");
        }, 0, 1, TimeUnit.SECONDS);
    }

}
